module Crinja::Object

Overview

This module can be included into custom types to make their instances available as values inside the Crinja runtime.

There are three types of properties that can be exposed to the Crinja runtime:

Through the static comilation it is not possible to access properties or methods of an object directly from inside the Crinja runtime. These methods allow to define a name-based lookup and return the corresponding values. If the looked-up name is not defined, the return value for crinja_call should be nil. should return Crinja::Undefined.

crinja_attribute and crinja_item must return an Crinja::Undefined if there is no attribute or item of that name. In this case, Crinja::Resolver may try other methods of accessing the attribute or item depending on the type of lookup (see Notes on Subscription for Jinja2).

Implementing classes do not need to implement these methods. They will only be accessed if an instance of Crinja::Object responds to them. Otherwise it will be considered as if there are no attributes, items or methods defined.

Example:

class User
  include Crinja::Object

  property name : String
  property dob : Time

  def initialize(@name, @dob)
  end

  def age
    (Time.now - @dob).years
  end

  def crinja_attribute(attr : Crinja::Value) : Crinja::Value
    value = case attr.to_string
            when "name"
              name
            when "age"
              age
            else
              Undefined.new(attr.to_s)
            end

    Crinja::Value.new(value)
  end

  def crinja_call(name : String) : Crinja::Callable | Crinja::Callable::Proc | Nil
    if name == "days_old"
      ->(arguments : Crinja::Arguments) do
        self.age.days
      end
    end
  end
end

Direct including types

Defined in:

object.cr