/**
 * Licensed 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.
 */
/**
 * Generated by Apache Flex Cross-Compiler from mypackage/TestClass.as
 * mypackage.TestClass
 *
 * @fileoverview
 *
 * @suppress {checkTypes|accessControls}
 */

goog.provide('mypackage.TestClass');

goog.require('otherpackage.Event');



/**
 * @constructor
 */
mypackage.TestClass = function() {

this.event = new otherpackage.Event();
};


/**
 * Prevent renaming of class. Needed for reflection.
 */
goog.exportSymbol('mypackage.TestClass', mypackage.TestClass);


/**
 * @private
 * @type {otherpackage.Event}
 */
mypackage.TestClass.prototype.event;


/**
 * Metadata
 *
 * @type {Object.<string, Array.<Object>>}
 */
mypackage.TestClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'TestClass', qName: 'mypackage.TestClass', kind: 'class' }] };



/**
 * Reflection
 *
 * @return {Object.<string, Function>}
 */
mypackage.TestClass.prototype.FLEXJS_REFLECTION_INFO = function () {
  return {
    variables: function () {return {};},
    accessors: function () {return {};},
    methods: function () {
      return {
        'TestClass': { type: '', declaredBy: 'mypackage.TestClass'}
      };
    }
  };
};
