def _perform(environment)
args = Sass::Util.enum_with_index(@args).
map {|a, i| perform_arg(a, environment, signature && signature.args[i])}
keywords = Sass::Util.map_hash(@keywords) do |k, v|
[k, perform_arg(v, environment, k.tr('-', '_'))]
end
splat = Sass::Tree::Visitors::Perform.perform_splat(
@splat, keywords, @kwarg_splat, environment)
if (fn = environment.function(@name))
css_variable_warning.warn! if css_variable_warning
return without_original(perform_sass_fn(fn, args, splat, environment))
end
args = construct_ruby_args(ruby_name, args, splat, environment)
if Sass::Script::Functions.callable?(ruby_name)
css_variable_warning.warn! if css_variable_warning
local_environment = Sass::Environment.new(environment.global_env, environment.options)
local_environment.caller = Sass::ReadOnlyEnvironment.new(environment, environment.options)
result = opts(Sass::Script::Functions::EvaluationContext.new(
local_environment).send(ruby_name, *args))
without_original(result)
else
opts(to_literal(args))
end
rescue ArgumentError => e
reformat_argument_error(e)
end