| #-- |
| # 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 |