SlideShare a Scribd company logo
Concerns and 
Presenters 
By - Aaditi Jain
Concerns
Concern : Structure
Concern : Dependency
Concern : Dependency 
Methods of a concern are not invoked until the concern is included in something that is not a 
concern.
Concerns in Models : DRYing 
Example : Consider a Article model, a Event model and a Comment Model. An article or an event 
has_many comments. A comment belongs_to either article or event.
Concerns in Models : DRYing
Concerns in Models : DRYing
Concerns in Models : Modularization 
Example : Consider a Event model. A event has many attenders and comments. Typically, 
the event model might look like this:
Concerns in Models : Modularization
Concerns In Controllers : 
Modularization and DRYing 
Concerns can be used in Controllers in a similar way as in Models. 
Example: 
• An Users controller, an Articles Controller, an Events Controller. 
• A User has to login to view all the articles and events . 
• Typically: Both Articles and Events controller will have some logic to check 
that the user has logged in etc. 
• Concerns : Shift all the common logic related to user in Article and Event 
controller into a concern module called Authorizable. Then Include this 
Authorizable module in Articles and Events Controller.
Concerns: Placement and Logic 
Placement 
• If only one concern per model/controller or One concern is being included by 
multiple models/controllers: Place them directly under the concerns folder. 
app/controller/concern/authorizable.rb 
app/model/concern/commentable.rb 
• If many concerns per model/controller: Create a folder inside the concerns 
with the name of the model/controller and place them inside it. 
app/model/event/attendable.rb 
Logic: 
Concerns should be domain based rather than technical based. For Example : 
For a model, domain based concerns will be like ‘Commentable’, ‘Taggable’, 
While technical based concerns will be ‘FinderMethod’, ‘ValidationMethod’
Concerns: Pros and Cons 
Pros 
• Easy to Use for refactoring. 
• No external dependency 
Cons 
• Modules Problem 
• Debugging is tougher 
• No actual reduction in code. Its just better organized.
Presenters
Example : 
Consider an application with this setup :
Problems With this Approach 
• Multiple Instance Variables in Controllers : 
1) Violation Of Sandi Metz Rule : One Controller action may pass only one 
instance variable to its corresponding view. 
2) Seperation of Concern in Controllers 
• Logic creeping In the view files 
Solutions : Include Logic as Models Methods 
Include Logic in Helpers
Presenters : A Design Pattern
Presenters : A Design Pattern 
Create a folder in your app directory with name ‘presenters’. Create a .rb file 
specific to the model we are working with (user in our case)
Presenters : A Design Pattern
Presenters Pros and Cons 
Pros 
• Introduces Object-Oriented-ness in the View Layer 
• Clean Controllers and Views 
• Easy Testing. 
Cons 
• Generating this additional layer is a overhead.
Thank You :)
References 
• https://github.com/justin808/fat-code-refactoring-techniques 
• http://railscasts.com/episodes/287-presenters-from-scratch 
• http://sokolmichael.com/posts/2012-01-14-model-view- 
controller-presenter-better-separation-of-concern 
• https://www.youtube.com/watch?v=VC5z8nadnQE

More Related Content

Similar to Concerns and Presenters in Rails

Jay Callicott Drupal Views 2.0 Presentation
Jay Callicott Drupal Views 2.0 PresentationJay Callicott Drupal Views 2.0 Presentation
Jay Callicott Drupal Views 2.0 Presentation
Mediacurrent
 
OBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .ppt
OBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .pptOBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .ppt
OBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .ppt
AshishSaraswat30
 
Module 2 design patterns-2
Module 2   design patterns-2Module 2   design patterns-2
Module 2 design patterns-2
Ankit Dubey
 
Object Oriented Analysis and Design with UML2 part2
Object Oriented Analysis and Design with UML2 part2Object Oriented Analysis and Design with UML2 part2
Object Oriented Analysis and Design with UML2 part2
Haitham Raik
 
Se lec1 (1)
Se lec1 (1)Se lec1 (1)
Se lec1 (1)
Huda Alameen
 
Design patterns
Design patternsDesign patterns
Design patterns
mudabbirwarsi
 
The Art and Science of Requirements Gathering
The Art and Science of Requirements GatheringThe Art and Science of Requirements Gathering
The Art and Science of Requirements GatheringVanessa Turke
 
Object Oriented System Design
Object Oriented System DesignObject Oriented System Design
Object Oriented System Design
Murugeswari Ravi
 
Chapter 1 intr m dfina
Chapter 1 intr m dfinaChapter 1 intr m dfina
Chapter 1 intr m dfina
Khalil Alhatab
 
The company which asked you to install a web server and properly s.docx
The company which asked you to install a web server and properly s.docxThe company which asked you to install a web server and properly s.docx
The company which asked you to install a web server and properly s.docx
mehek4
 
Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5Sudarshan Dhondaley
 
Chapter 3.pptx
Chapter 3.pptxChapter 3.pptx
Chapter 3.pptx
Tekle12
 
Recsys 2016
Recsys 2016Recsys 2016
Recsys 2016
Mindaugas Zickus
 
Design patterns
Design patternsDesign patterns
Design patterns
Ahmed Elharouny
 
Chapter 1 intr m dfina
Chapter 1 intr m dfinaChapter 1 intr m dfina
Chapter 1 intr m dfina
Khalil Alhatab
 
11 - Evaluating Framework in Interaction Design_new.pptx
11 - Evaluating Framework in Interaction Design_new.pptx11 - Evaluating Framework in Interaction Design_new.pptx
11 - Evaluating Framework in Interaction Design_new.pptx
ZahirahZairul2
 
03 Analyzing The Problem
03 Analyzing The Problem03 Analyzing The Problem
03 Analyzing The ProblemSandeep Ganji
 
Advanced Software Engineering.ppt
Advanced Software Engineering.pptAdvanced Software Engineering.ppt
Advanced Software Engineering.ppt
Rvishnupriya2
 
DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016
DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016
DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016
IXIASOFT
 

Similar to Concerns and Presenters in Rails (20)

Unit 2
Unit 2Unit 2
Unit 2
 
Jay Callicott Drupal Views 2.0 Presentation
Jay Callicott Drupal Views 2.0 PresentationJay Callicott Drupal Views 2.0 Presentation
Jay Callicott Drupal Views 2.0 Presentation
 
OBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .ppt
OBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .pptOBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .ppt
OBJECT ORIENTED ANALYSIS FOR EASY UNDERSTANDING .ppt
 
Module 2 design patterns-2
Module 2   design patterns-2Module 2   design patterns-2
Module 2 design patterns-2
 
Object Oriented Analysis and Design with UML2 part2
Object Oriented Analysis and Design with UML2 part2Object Oriented Analysis and Design with UML2 part2
Object Oriented Analysis and Design with UML2 part2
 
Se lec1 (1)
Se lec1 (1)Se lec1 (1)
Se lec1 (1)
 
Design patterns
Design patternsDesign patterns
Design patterns
 
The Art and Science of Requirements Gathering
The Art and Science of Requirements GatheringThe Art and Science of Requirements Gathering
The Art and Science of Requirements Gathering
 
Object Oriented System Design
Object Oriented System DesignObject Oriented System Design
Object Oriented System Design
 
Chapter 1 intr m dfina
Chapter 1 intr m dfinaChapter 1 intr m dfina
Chapter 1 intr m dfina
 
The company which asked you to install a web server and properly s.docx
The company which asked you to install a web server and properly s.docxThe company which asked you to install a web server and properly s.docx
The company which asked you to install a web server and properly s.docx
 
Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5Designing and documenting software architecture unit 5
Designing and documenting software architecture unit 5
 
Chapter 3.pptx
Chapter 3.pptxChapter 3.pptx
Chapter 3.pptx
 
Recsys 2016
Recsys 2016Recsys 2016
Recsys 2016
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Chapter 1 intr m dfina
Chapter 1 intr m dfinaChapter 1 intr m dfina
Chapter 1 intr m dfina
 
11 - Evaluating Framework in Interaction Design_new.pptx
11 - Evaluating Framework in Interaction Design_new.pptx11 - Evaluating Framework in Interaction Design_new.pptx
11 - Evaluating Framework in Interaction Design_new.pptx
 
03 Analyzing The Problem
03 Analyzing The Problem03 Analyzing The Problem
03 Analyzing The Problem
 
Advanced Software Engineering.ppt
Advanced Software Engineering.pptAdvanced Software Engineering.ppt
Advanced Software Engineering.ppt
 
DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016
DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016
DITA Surprise, Unwrapping DITA Best Practices - tekom tcworld 2016
 

Recently uploaded

Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
SOFTTECHHUB
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Neo4j
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
Pierluigi Pugliese
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Vladimir Iglovikov, Ph.D.
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
nkrafacyberclub
 

Recently uploaded (20)

Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
 

Concerns and Presenters in Rails

  • 1. Concerns and Presenters By - Aaditi Jain
  • 5. Concern : Dependency Methods of a concern are not invoked until the concern is included in something that is not a concern.
  • 6. Concerns in Models : DRYing Example : Consider a Article model, a Event model and a Comment Model. An article or an event has_many comments. A comment belongs_to either article or event.
  • 9. Concerns in Models : Modularization Example : Consider a Event model. A event has many attenders and comments. Typically, the event model might look like this:
  • 10. Concerns in Models : Modularization
  • 11. Concerns In Controllers : Modularization and DRYing Concerns can be used in Controllers in a similar way as in Models. Example: • An Users controller, an Articles Controller, an Events Controller. • A User has to login to view all the articles and events . • Typically: Both Articles and Events controller will have some logic to check that the user has logged in etc. • Concerns : Shift all the common logic related to user in Article and Event controller into a concern module called Authorizable. Then Include this Authorizable module in Articles and Events Controller.
  • 12. Concerns: Placement and Logic Placement • If only one concern per model/controller or One concern is being included by multiple models/controllers: Place them directly under the concerns folder. app/controller/concern/authorizable.rb app/model/concern/commentable.rb • If many concerns per model/controller: Create a folder inside the concerns with the name of the model/controller and place them inside it. app/model/event/attendable.rb Logic: Concerns should be domain based rather than technical based. For Example : For a model, domain based concerns will be like ‘Commentable’, ‘Taggable’, While technical based concerns will be ‘FinderMethod’, ‘ValidationMethod’
  • 13. Concerns: Pros and Cons Pros • Easy to Use for refactoring. • No external dependency Cons • Modules Problem • Debugging is tougher • No actual reduction in code. Its just better organized.
  • 15. Example : Consider an application with this setup :
  • 16. Problems With this Approach • Multiple Instance Variables in Controllers : 1) Violation Of Sandi Metz Rule : One Controller action may pass only one instance variable to its corresponding view. 2) Seperation of Concern in Controllers • Logic creeping In the view files Solutions : Include Logic as Models Methods Include Logic in Helpers
  • 17. Presenters : A Design Pattern
  • 18. Presenters : A Design Pattern Create a folder in your app directory with name ‘presenters’. Create a .rb file specific to the model we are working with (user in our case)
  • 19. Presenters : A Design Pattern
  • 20. Presenters Pros and Cons Pros • Introduces Object-Oriented-ness in the View Layer • Clean Controllers and Views • Easy Testing. Cons • Generating this additional layer is a overhead.
  • 22. References • https://github.com/justin808/fat-code-refactoring-techniques • http://railscasts.com/episodes/287-presenters-from-scratch • http://sokolmichael.com/posts/2012-01-14-model-view- controller-presenter-better-separation-of-concern • https://www.youtube.com/watch?v=VC5z8nadnQE