Skip to content

Instantly share code, notes, and snippets.

@bjallen
Created August 2, 2012 20:00
Show Gist options
  • Save bjallen/3240161 to your computer and use it in GitHub Desktop.
Save bjallen/3240161 to your computer and use it in GitHub Desktop.
delegate aliases
# code I found (i.e. not mine)
class Module
def metaclass(&block)
meta = class << self; self; end
meta.module_eval(&block) if block_given?
meta
end
def const_delegate(to,*methods)
mc = to.metaclass
methods.each do |(source,target)|
mc.class_eval "def #{target || source}(*args); #{self}.#{source}(*args); end"
end
end
end
# this was in an initializer
Tripyn.const_delegate Airport,
[:airport_for_iata_code, :for],
[:airport_for_iata_code!, :for!],
[:airport_for_iata_code, :for_iata_code],
[:airport_for_iata_code!, :for_iata_code!],
[:airport_for_fs_code, :for_fs_code],
[:airport_for_fs_code!, :for_fs_code!],
[:closest_airport_to, :closest_to]
#---------------------------------------------------------------
# option 1
# kinda clunky, but no meta-programming and it uses only existing solutions
class Airport
class << self
delegate :all_airports,
:airport_for_iata_code,
:airport_for_iata_code!,
:airport_for_iata_code,
:airport_for_fs_code,
:airport_for_fs_code!,
:closest_airport_to,
:to => Tripyn
alias_method :all, :all_airports
alias_method :for, :airport_for_iata_code
alias_method :for!, :airport_for_iata_code!
alias_method :for_iata_code, :airport_for_iata_code
alias_method :for_iata_code!, :airport_for_iata_code!
alias_method :for_fs_code, :airport_for_fs_code
alias_method :for_fs_code, :airport_for_fs_code!
alias_method :closest_to, :closest_airport_to
end
end
#---------------------------------------------------------------
# option 2
# extends module, but still pretty straightforward
class Module
def delegate_aliases(to, *aliases)
aliases.each do |(source, target)|
delegate target, :to => to
alias_method source, target
end
end
end
class Airport
class << self
delegate_aliases Tripyn,
[:for, :airport_for_iata_code],
[:for!, :airport_for_iata_code!],
[:for_iata_code, :airport_for_iata_code],
[:for_iata_code!, :airport_for_iata_code!],
[:for_fs_code, :airport_for_fs_code],
[:for_fs_code!, :airport_for_fs_code!],
[:closest_to, :closest_airport_to]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment