Skip to content

Instantly share code, notes, and snippets.

@splattael
Created August 24, 2012 12:47
Show Gist options
  • Save splattael/3450174 to your computer and use it in GitHub Desktop.
Save splattael/3450174 to your computer and use it in GitHub Desktop.
class CreateUser < Context
def initialize(attributes)
@attributes = attributes
end
def self.call(*args)
new(*args).tap(&:call)
end
def callback(*args)
# execute CallbackProxy
end
def call
user = User.create!(@attributes)
if with_team?
team = Team.create!(:leader => user)
success.user_created_with_team(user, team)
else
success.user_created(user)
end
rescue ActiveRecord::RecordInvalid => e
failure.user_invalid e, e.record
end
def success
# Record via CallbackProxy
end
def failure
# Record via CallbackProxy
end
class CallbackProxy
def method_missing(method, *args)
@methods << [ methods, args ]
end
def execute(callback)
@methods.each do |method, args|
callback.public_send(method, *args)
end
end
end
end
class UserMailer
def user_created(user)
end
def user_created_with_team(user, team)
end
end
class UserError
def user_invalid(error)
end
def lfp_sucks(error)
end
end
CreateUser.call(user_id).callback SendUserMail.new, UserError.new
CreateUser.call(user_id).callback UserMailer.new
CreateUser.call(user_id).callback :success => SendUserMail.new, :failure => UserError.new
CreateUser.call(user_id).callback do |success, failure|
success.user_created do |user|
end
success.user_created_with_team do |user|
end
failure.user_invalid do |error|
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment