blob: d60e9e4481a97f349901e44525d69deff0a5c900 [file] [log] [blame]
#--
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#++
module Qpid::Proton::Util
# Provides helper functions for writing wrapper functions for the
# underlying C APIs.
#
# Before defining any mutators the class must define the name of the
# prefix for methods with the constant PROTON_METOD_PREFIX.
#
# == Mutators, Setters And Getters
#
# There are three types of wrappers that are supported:
#
# [proton_writer] Defines a set-only method for the named attribute.
# [proton_reader] Defines a get-only method for the named attribute.
# [proton_accessor] Defines both a set- and a get-method for the named
# attribute.
# [proton_caller] A simple wrapper for calling an underlying method,
# avoids repetitive boiler plate coding.
#
# == Arguments
#
# [:is_or_get => {:is, :get}] For both the getter and the mutator types
# you can also declare that the method uses "is" instead of "get" in the
# underlying API. Such methods are then defined with "?"
#
# @example
# class Terminus
#
# include WrapperHelper
#
# PROTON_METHOD_PREFIX = "pn_terminus"
#
# # add methods "type" and "type=" that call "pn_terminus_{get,set}_type"
# proton_accessor :type
#
# # adds the method "dynamic?" that calls "pn_terminus_is_dynamic"
# proton_accessor :dynamic, :is_or_get => :is
#
# # adds a method named "foo" that calls "pn_terminus_foo"
# proton_caller :foo
#
# end
#
# @private
module SwigHelper
def self.included(base)
base.extend ClassMethods
end
module ClassMethods # :nodoc:
def create_wrapper_method(name, proton_method, with_arg = false)
if with_arg
define_method "#{name}" do |arg|
Cproton.__send__(proton_method.to_sym, @impl, arg)
end
else
define_method "#{name}" do
Cproton.__send__(proton_method.to_sym, @impl)
end
end
end
# Defines a method that calls an underlying C library function.
def proton_caller(name, options = {})
proton_method = "#{self::PROTON_METHOD_PREFIX}_#{name}"
# drop the trailing '?' if this is a property method
proton_method = proton_method[0..-2] if proton_method.end_with? "?"
create_wrapper_method(name, proton_method)
end
def proton_writer(name, options = {})
proton_method = "#{self::PROTON_METHOD_PREFIX}_set_#{name}"
create_wrapper_method("#{name}=", proton_method, true)
end
def proton_reader(name, options = {})
an_is_method = options[:is_or_get] == :is
prefix = (an_is_method) ? "is" : "get"
proton_method = "#{self::PROTON_METHOD_PREFIX}_#{prefix}_#{name}"
name = "#{name}?" if an_is_method
create_wrapper_method(name, proton_method)
end
def proton_accessor(name, options = {})
proton_writer(name, options)
proton_reader(name, options)
end
end
end
end