# Class Extension Mixin

**URL:** <https://www.ruby-forum.com/t/class-extension-mixin/194769>\
**Category:** Ruby\
**Created:** [September 10, 2010, 9:04am UTC](https://www.ruby-forum.com/t/class-extension-mixin/194769 "2010-09-10T09:04:41Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![eugen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/ebca7d/32.png) [@eugen](https://www.ruby-forum.com/u/eugen)\
**Post date:** [September 10, 2010, 9:04am UTC](https://www.ruby-forum.com/t/class-extension-mixin/194769/1 "2010-09-10T09:04:41Z")

</div>

Hi

I want to buid up module of Financial variables.  
It can be used like this  
Financial.year.start #returns start of … guess what 🙂  
Financial.year.finish  
Financial.quarter.start  
Financial.quarter.end

…  
You got the idea. It must be easily extensible.  
Here is what I came up with:

#!/usr/lib/ruby

module FinancialYear  
def year  
EndPoint.new  
end  
class EndPoint  
def start  
@start = “01/01/”+Time.now.strftime("%Y")  
end  
def finish  
@finish = “31/12/”+Time.now.strftime("%Y")  
end  
end  
end

module Period  
def self.included(base)  
base.extend(FinancialYear)  
end  
end

module Financial  
include Period  
end

I used mostly idioms from Metaprogramming Ruby - Class Extension Mixin  
Any suggestion for improvement ?  
I am novice in ruby so any suggestion is welcome !

---

<div class="post-metadata">

**Author:** ![eugen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/ebca7d/32.png) [@eugen](https://www.ruby-forum.com/u/eugen)\
**Post date:** [September 10, 2010, 6:06pm UTC](https://www.ruby-forum.com/t/class-extension-mixin/194769/2 "2010-09-10T18:06:13Z")

</div>

On Sep 10, 9:02 am, Eugen C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I used mostly idioms from Metaprogramming Ruby - Class Extension Mixin  
> Any suggestion for improvement ?

The point of a Class Extension Mixin is that you can use to get both  
class methods and instance methods with a single include(). If you  
only have class methods, you can also use a simple extend() in the  
inclusor.

For something as simple as your example, even that might be overkill.  
Unless you have a specific reason to decouple the year() method by  
putting it in a separate module, you might be better off just defining  
it as a class method of Financial:

class EndPoint  
def start  
@start = “01/01/”+Time.now.strftime(“%Y”)  
end  
def finish  
@finish = “31/12/”+Time.now.strftime(“%Y”)  
end  
end

module Financial  
def self.year  
EndPoint.new  
end  
end

Financial.year.start # =\> “01/01/2010”  
Financial.year.finish # =\> “31/12/2010”

Paolo Perrotta  
Metaprogramming Ruby ([Pragmatic Bookshelf: By Developers, For Developers](http://www.pragprog.com/titles/ppmetr))
