////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
package
{
    [Bindable]
    public class Item
    {
        private var _name:String;
        private var _photo:String;
		private var _price:String;
        
        public function Item()
        {
        }
        
        public function get name():String
        {
            return _name;
        }
		
		public function set name(name:String):void
		{
			_name = name;
		}

		public function get photo():String
        {
            return _photo;
        }
		
		public function set photo(photo:String):void
		{
			_photo = photo;
		}
        
		public function get price():String
		{
			return _price;
		}
		public function set price(price:String):void
		{
			_price = price;
		}

    }
}